﻿using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Windows;

namespace 解释器模式_Message
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    /// 介绍
    /// 给定一个语言, 定义它的文法的一种表示，并定义一个解释器，该解释器使用该表示来解释语言中的句子。
    /// 
    /// 示例
    /// 有一个Message实体类，某个类对它的操作有Get()方法。现在要求用具有某一规则的中文语法来执行这个操作。
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            var chinese = "{数据库}[信息](获取)";
            var context = new Context(chinese);
            List<AbstractExpression> l = new List<AbstractExpression>();
            l.Add(new DatabaseExpression());
            l.Add(new ObjectExpression());
            l.Add(new MethodExpression());
            foreach (AbstractExpression exp in l)
            {
                exp.Interpret(context);
            }
            Assembly assembly = Assembly.Load("解释器模式-Message");
            MethodInfo method = assembly.GetType("解释器模式_Message." + 
                context.Output.Split('.')[0]).GetMethod(context.Output.Split('.')[1].Replace("()", ""));
            object obj = method.Invoke(null, null);
            List<MessageModel> m = (List<MessageModel>)obj;
            Debug.Write("中文语法：" + chinese);
            Debug.Write("==============================");
            Debug.Write("解释后的C#代码：" + context.Output);
            Debug.Write("==============================");
            Debug.Write("执行结果：" + m[0].Message + " " + m[0].PublishTime);
        }
    }
}
